其他
一文带你看通透,MySQL事务ACID四大特性实现原理
hello,大家好,我是张张,「架构精进之路」公号作者。
1、ACID特性
原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
2、ACID 具体实现
原子性:通过undolog来实现。 持久性:通过binlog、redolog来实现。 隔离性:通过(读写锁+MVCC)来实现。 一致性:MySQL通过原子性、持久性、隔离性最终实现数据一致性。
2.1 原子性原理
COMMIT 表示提交,即提交事务的所有操作并持久化到数据库中。 ROLLBACK表示回滚,即在事务中运行的过程中发生了某种故障,事务不能继续执行,系统将事务中对数据库所有已完成的操作全部撤销,回滚到事务开始时的状态,这里的操作指对数据库的更新操作(查询操作忽略)。这时候需要用到 undolog 来进行回滚。
insert语句,回滚时会执行 delete; delete语句,回滚时会执行insert; update语句,回滚时便执行相反的update,把数据改回来。
2.2 持久性原理
它类似于一个卸货的小推车,我们若是每卸一件物品就拿着去入库,那岂不是特浪费时间,若有一个小推车,我们将货物首先存放在小推车,当推车满了再往库里存,可以大大提升效率。 其实就是MySQL里经常说到的WAL技术,WAL的全称是Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先装小推车,等不忙的时候再装库。
0——>事务提交时只把redo log留在redo log buffer 1——>将redo log直接持久化到磁盘(所以有个双“1”配置,后面会讲) 2——>只是把redo log写到page cache
2.3 隔离性原理
MYSQL有四种隔离级别,用来解决存在的并发问题:脏读、幻读、不可重复读。
表锁:读锁(不会阻塞其他线程的读操作,阻塞写操作);写锁(读写操作都阻塞)
行锁:需要的时候加上,并不是马上释放,等事务提交才释放,两阶段锁协议
锁的类型
间隙锁-gap lock:锁定区间范围,防止幻读,左开右开,只在可重复读隔离级别下生效—|—为了阻止多个事务将记录插入到同一范围内,而这会导致幻读问题的产生
记录锁-record Lock:锁定行记录,索的索引,索引失效,为表锁
临键锁-next-key Lock:record lock+gap lock 左开右闭(解决幻读)
锁的模式
select .... for update (持有写锁,别的不可加读锁,也不可加写锁)
select .... lock in share mode(持有读锁,别的可以再加读锁,不可加写锁)
共享锁-读锁-S锁
排他锁-写锁-X锁
意向锁:读意向锁+写意向锁
自增锁
全局锁:全库逻辑备份
死锁:两个或多个事务在同一资源上相互占用,并请求加锁时,造成相互等待,无限阻塞
MVCC:实现多版本并发控制,实现原理:使用版本链+Read View
总结
如果您觉得还不错,欢迎关注和转发~